﻿using System;
using System.ComponentModel.DataAnnotations;
using System.Data.Objects.DataClasses;
using System.ServiceModel.DomainServices.Server;

namespace IssueVision.Data.Web
{
    // The MetadataTypeAttribute identifies IssueMetadata as the class
    // that carries additional metadata for the Issue class.
    [MetadataTypeAttribute(typeof(Issue.IssueMetadata))]
    [CustomValidation(typeof(IssueRules), "CheckStatusOpen")]
    [CustomValidation(typeof(IssueRules), "CheckStatusActive")]
    [CustomValidation(typeof(IssueRules), "CheckStatusResolved")]
    public partial class Issue
    {
        // This class allows you to attach custom attributes to properties
        // of the Issue class.
        //
        // For example, the following marks the Xyz property as a
        // required property and specifies the format for valid values:
        //    [Required]
        //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
        //    [StringLength(32)]
        //    public string Xyz { get; set; }
        internal sealed class IssueMetadata
        {

            // Metadata classes are not meant to be instantiated.
            private IssueMetadata()
            {
            }

            public long IssueID { get; set; }

            [Display(Name = "TitleLabel", ResourceType = typeof(IssueVisionResources))]
            public string Title { get; set; }

            public byte StatusID { get; set; }

            public Nullable<byte> SubStatusID { get; set; }

            [Display(Name = "AssignedToIDLabel", ResourceType = typeof(IssueVisionResources))]
            public string AssignedToID { get; set; }

            public byte IssueTypeID { get; set; }

            public byte Severity { get; set; }

            public byte Priority { get; set; }

            public string ChangedByID { get; set; }

            public DateTime LastChange { get; set; }

            public string OpenedByID { get; set; }

            public DateTime OpenedDate { get; set; }

            public Nullable<int> PlatformID { get; set; }

            public Nullable<DateTime> ResolutionDate { get; set; }

            [Display(Name = "ResolutionIDLabel", ResourceType = typeof(IssueVisionResources))]
            public Nullable<byte> ResolutionID { get; set; }

            public string ResolvedByID { get; set; }

            public string Description { get; set; }

            public string ReproSteps { get; set; }

            public Nullable<long> DuplicateID { get; set; }

            [Include]
            public EntityCollection<Attribute> Attributes { get; set; }

            [Include]
            public EntityCollection<File> Files { get; set; }

            public User AssignedToUser { get; set; }

            public User ChangedByUser { get; set; }

            public User OpenedByUser { get; set; }

            public User ResolvedByUser { get; set; }

            public EntityCollection<Issue> DuplicateIssues { get; set; }

            public Issue DuplicateIssue { get; set; }

            public IssueType IssueType { get; set; }

            public Platform Platform { get; set; }

            public Resolution Resolution { get; set; }

            public Status Status { get; set; }

            public SubStatus SubStatus { get; set; }
        }
    }
}
